package com.learn.algorlthm;

/**
 * @classname:
 * @Description:数组中只出现一次的数字
 * @author: yfpu
 * @Date: 2018-08-15 14:04
 * 题目描述：
 * 一个整型数组里除了两个数字之外，其他的数字都出现了两次，找出这两个数。
 */
public class Learn56 {


    /**
     * 解题思路：
     * 两个不相等的元素在位级表示上必定会有一位存在不同，将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。
     * <p>
     * diff &= -diff 得到出 diff 最右侧不为 0 的位，也就是不存在重复的两个元素在位级表示上最右侧不同的那一位，
     * 利用这一位就可以将两个元素区分开来
     */

    public void findNumsAppearOnce(int[] nums, int nums1[], int nums2[]) {
        int diff = 0;
        for (int num : nums) {
            diff ^= num;
        }
        diff &= -diff;
        for (int num : nums) {
            if ((num & diff) == 0)
                nums1[0] ^= num;
            else
                nums2[0] ^= num;
        }
    }
}
